package com.lyc.project.listener;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.rabbitmq.client.Channel;
import com.lyc.common.model.entity.Order;
import com.lyc.project.model.enums.OrderStatusEnum;
import com.lyc.project.service.TOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import static com.lyc.project.config.RabbitmqConfig.QUEUE_ORDER_DLX;


@Component
@Slf4j
public class OrderTimeOutListener {
    
    @Resource
    private TOrderService orderService;

    //监听queue_order_dlx_queue死信队列，实现支付超时的回滚功能
    //生产者是懒加载机制，消费者是饿汉加载机制，二者机制不对应，所以消费者要自行创建队列并加载，否则会报错
    @RabbitListener(queuesToDeclare = { @Queue(QUEUE_ORDER_DLX)})
    public void receiveOrderMsg(Order order,Message message, Channel channel) throws IOException {
        // 接收转换消息
        // 根据订单id查询订单状态
        // 判断状态是否为已支付
        // 取消订单，将订单变成已失效！回滚库存，这里就没做什么都不动吧，因为我没给接口搞库存，
        
        log.info("监听到消息啦，内容是："+order.toString());
        Order dbOrder = orderService.getById(order.getId());

        //根据订单状态判断订单是否支付成功，如果没有支付成功则修改订单状态和回滚，这里不实现回滚
        if (dbOrder.getStatus().equals(OrderStatusEnum.UNPAY.getValue())){
            try {
                UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
                updateWrapper.set("status",OrderStatusEnum.FAILURE.getValue());
                updateWrapper.eq("id",dbOrder.getId());
                orderService.update(updateWrapper);
                // 手动签收
                // 因为已经确定消息是不会发送到这里的，没必要签收了，否则会报错，报错但不影响程序的正常运行
//                channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
            } catch (Exception e) {
                log.error("出现异常，拒绝签收");
                // e.printStackTrace();
//                channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
            }
        }
        // 如果已支付不做处理直接手动签收
//        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}